﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Zarzadzanie_Restautacja.Controllers;
using Zarzadzanie_Restautacja.Helpers;
using Zarzadzanie_Restautacja.Model;

namespace Zarzadzanie_Restautacja.Forms
{
    public partial class KuchniaForm : Form
    {
        //<id zamowieniapotrawy, nazwa potrawy>
        private Dictionary<int, string> potrawy_do_obsluzenia = new Dictionary<int, string>();
        private Dictionary<int, string> potrawy_do_wydania = new Dictionary<int, string>();

        public KuchniaForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Pobiera z bazy posilki do przygotowania
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNoweOk_Click(object sender, EventArgs e)
        {
            try
            {
                using (RestauracjaContext context = new RestauracjaContext())
                {
                    IQueryable<ZamowieniaPotrawy> quZamowieniaPotrawy = context.ZamowieniaPotrawy
                       .Where(zampotr => zampotr.CzyWydana == (int)ZamowieniePotrawaStatus.KelnerZlecilDoKuchni);

                    if (quZamowieniaPotrawy.Any())
                    {
                        foreach (var item in quZamowieniaPotrawy.ToList())
                        {
                            if (!this.potrawy_do_obsluzenia.ContainsKey(item.Id) && !this.potrawy_do_wydania.ContainsKey(item.Id))
                            {
                                this.potrawy_do_obsluzenia.Add(
                                    item.Id, context.Potrawy.Where(pot => pot.Id == item.IdPotrawy).First().Nazwa);
                            }
                        }

                        context.SaveChanges();
                    }
                }

                this.PrzypiszDane();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Wystapił błąd przy przyjmowaniu potraw");
            }
        }

        /// <summary>
        /// Przenosi potrawę do listy gotujących się potraw
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGotuj_Click(object sender, EventArgs e)
        {
            if (lbDoObsluzenia.SelectedItem != null)
            {
                KeyValuePair<int, string> selectedItem = (KeyValuePair<int, string>)lbDoObsluzenia.SelectedItem;
                this.potrawy_do_wydania.Add(selectedItem.Key, selectedItem.Value);
                this.potrawy_do_obsluzenia.Remove(selectedItem.Key);
                this.PrzypiszDane();
            }
        }

        /// <summary>
        /// Kończy gotować - wydaje posiłek.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWydaj_Click(object sender, EventArgs e)
        {
            if (lbDoWydania.SelectedItem != null)
            {
                KeyValuePair<int, string> selectedItem = (KeyValuePair<int, string>)lbDoWydania.SelectedItem;
                this.potrawy_do_wydania.Remove(selectedItem.Key);
                this.PrzypiszDane();

                using (RestauracjaContext context = new RestauracjaContext())
                {
                    if (context.PracownicyKuchni.Where(kuch => kuch.Id == AppSettings.LoggedUserId).Any())
                    {
                        Kuchnia kuchnia = context.PracownicyKuchni.Where(kuch => kuch.Id == AppSettings.LoggedUserId).First();
                        ZamowieniaPotrawy zampotr = context.ZamowieniaPotrawy.Where(zampot => zampot.Id == selectedItem.Key).First();
                        kuchnia.WydajKelnerowiPosilek(zampotr);
                    }
                }
            }
        }

        private void PrzypiszDane()
        {
            if (this.potrawy_do_obsluzenia.Count == 0)
            {
                this.lbDoObsluzenia.DataSource = null;
            }
            else
            {
                this.lbDoObsluzenia.DataSource = new BindingSource(this.potrawy_do_obsluzenia, null);
                lbDoObsluzenia.DisplayMember = "Value";
                lbDoObsluzenia.ValueMember = "Key";
            }


            if (this.potrawy_do_wydania.Count == 0)
            {
                this.lbDoWydania.DataSource = null;
            }
            else
            {
                this.lbDoWydania.DataSource = new BindingSource(this.potrawy_do_wydania, null);
                lbDoWydania.DisplayMember = "Value";
                lbDoWydania.ValueMember = "Key";
            }
        }

        private void lbDoObsluzenia_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}
